package com.obelisco.vista.componentes;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;

//import ucla.cumlaude.modelo.data.PlanEstudio;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Insets;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.jgoodies.binding.list.echo.SelectionInList;
import com.obelisco.vista.componentes.TablaDatosSimple.GenericTableModel;
import com.obelisco.vista.plantillas.VentanaBase;
import com.obelisco.vista.plantillas.VentanaDialogoBase;

import echopointng.ContainerEx;
import echopointng.layout.DisplayLayoutData;

public class Catalogo extends VentanaDialogoBase {

	protected com.obelisco.vista.componentes.TablaDatosSimple tablaLista;
	
	private ContainerEx paneSuperior;

	private PaneBusquedaBase paneBusquedaBase;

	private TablaDatosSimple tabla;
	
	private List listaParametros;
	
	private Object objetoEntidad;

	private Map<String, String> camposMostrar;
	
	protected String campoToolTipText;

	private Vector<CatalogoListener> listenersCatalogo = new Vector<CatalogoListener>();
	
	private ContenedorBusqueda contenedorBusqueda;
	
	private boolean permitirRepetirObjetos = false;

	public VentanaListener eventosVentana = new VentanaListener() {

		public void onMostrar(Ventana ventana) {
			if (contenedorBusqueda != null) {
				paneBusquedaBase.inicializar();			
				tabla.clearSelection();				
				List listaObjetos = contenedorBusqueda.realizarBusqueda();
				if ((permitirRepetirObjetos == false) && (tablaLista != null) && (tablaLista.getListaItems() != null)) {
					listaObjetos.removeAll(tablaLista.getListaItems());
				}
				tabla.setItems(listaObjetos,camposMostrar,null);
			}
			else {
				paneSuperior.removeAll();
			}
		}

		public void onSalir(Ventana ventana, boolean cerrar) {			
			if ((getAccionSeleccionada() == TipoAccion.ACEPTAR) && (tablaLista != null)) {
				List listaitems = tablaLista.getListaItems();
				if (listaitems == null) {
					listaitems = new ArrayList();
				}
				if (tabla.getFilasSeleccionadas() != null) {
					if (tabla.getFilasSeleccionadas() instanceof List) {
						List lista = (List) tabla.getFilasSeleccionadas();
						listaitems.addAll(lista);
					}
					else {
						Object objeto = tabla.getFilasSeleccionadas();
						if (!listaitems.contains(objeto)) {
							listaitems.add(objeto);
						}
					}
				}
			}
			cerrar = true;
		}
	};
	
	
	public PaneBusquedaListener eventosPaneBusqueda = new PaneBusquedaListener() {

		public void resultadoBusqueda(List datos) {
			// Se asigna a la Tabla de Datos los Resultados de Busqueda en
			// conjunto
			// con la descripcion de los campos que va ha mostrar
			if ((permitirRepetirObjetos == false) && (tablaLista != null) && (tablaLista.getListaItems() != null)) {
				datos.removeAll(tablaLista.getListaItems());
			}
			tabla.setItems(datos, camposMostrar, null);
		}

	};
	
	public void setItems(List datos) {
		tabla.clearSelection();
		if (datos.size() > 0) {
			tabla.setCantidadFilas(datos.size());
		}
		else {
			tabla.setCantidadFilas(10);
		}
		if ((permitirRepetirObjetos == false) && (tablaLista != null) && (tablaLista.getListaItems() != null)) {
			datos.removeAll(tablaLista.getListaItems());
		}
		tabla.setItems(datos, camposMostrar, null);
	}

	public Catalogo() {
		//super.super("Catalogo", TipoVentana.DIALOGO);
		this.addVentanaListener(eventosVentana);
		initComponents();
	}
	
	private void initComponents() {		
		ContainerEx contenedor = new ContainerEx();
		TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
		contenedorLayoutData.setTitle("Catalogo");
		contenedor.setLayoutData(contenedorLayoutData);

		// Se agrega el Container donde va a estar ubicado el Panel de Busqueda
		paneSuperior = new ContainerEx();

		paneBusquedaBase = new PaneBusquedaBase();
		paneBusquedaBase.addPaneBusquedaListener(eventosPaneBusqueda);

		DisplayLayoutData layoutData = new DisplayLayoutData();
		layoutData.setOutsets(new Insets(new Extent(10)));
		Alignment alineacion = new Alignment(Alignment.LEADING, Alignment.TOP);
		layoutData.setAlignment(alineacion);
		paneBusquedaBase.setLayoutData(layoutData);

		paneSuperior.add(paneBusquedaBase);

		contenedor.add(paneSuperior);

		tabla = new TablaDatosSimple();
		tabla.setSeleccionMultiple(false);
		layoutData = new DisplayLayoutData();
		layoutData.setOutsets(new Insets(new Extent(10)));

		alineacion = new Alignment(Alignment.LEADING, Alignment.TOP);
		layoutData.setAlignment(alineacion);
		tabla.setLayoutData(layoutData);
		contenedor.add(tabla);
		
		this.getAreaTrabajo().add(contenedor);

		this.getAreaTrabajo().setEnabled(true);
	}

	public void seleccionarElemento() {
		this.objetoEntidad = tabla.getFilasSeleccionadas();
		if (objetoEntidad != null) {
			distribuirEventoSeleccion(objetoEntidad);
		}
	}

	private void distribuirEventoSeleccion(Object o) {
		for (CatalogoListener l : listenersCatalogo) {
			l.onSeleccionar(o);
		}

	}

	public void addCatalogoListener(CatalogoListener listener) {
		listenersCatalogo.add(listener);
	}

	public void removeCatalogoListener(CatalogoListener listener) {
		listenersCatalogo.remove(listener);
	}

	public void setContenedorBusqueda(ContenedorBusqueda contenedorBusqueda) {	
		this.contenedorBusqueda = contenedorBusqueda;
		this.paneBusquedaBase.setContenedorBusqueda(contenedorBusqueda);
		if (contenedorBusqueda instanceof ComponenteDatosListener) {
			addComponenteDatosListener((ComponenteDatosListener) contenedorBusqueda);			
		}		
	}

	public Map<String, String> getCamposMostrar() {
		return camposMostrar;
	}

	public void setCamposMostrar(Map<String, String> camposMostrar) {
		this.camposMostrar = camposMostrar;
	}

	public ContenedorBusqueda getContenedorBusqueda() {
		return contenedorBusqueda;
	}

	@Override
	public Object getObjetoEntidad() {
		// TODO Auto-generated method stub
		return this.objetoEntidad;
	}

	@Override
	public void inicializar() {
		// TODO Auto-generated method stub
		if (campoToolTipText != null) {
			tabla.setCampoToolTipText(campoToolTipText);
		}
	}

	@Override
	public void onConfirmarCambios(Object objeto, TipoFuncion funcion, String nombre) {
		distribuirEventoConfirmarCambios(objeto, funcion, nombre);		
	}
	
	private void distribuirEventoConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {

		for (ComponenteDatosListener l : listeners) {
			l.onConfirmarCambios(objeto, tipo, nombre);
		}

	}

	@Override
	public void onConsultar(Object objeto) {
		distribuirEventoConsultar(objeto);
		
	}
	
	private void distribuirEventoConsultar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onConsultar(objeto);
		}
	}

	@Override
	public void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion, String nombre) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onIncluir(Object objeto) {
		distribuirEventoIncluir(objeto);
		
	}
	
	private void distribuirEventoIncluir(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onIncluir(objeto);
		}
	}

	@Override
	public void onModificar(Object objeto) {
		distribuirEventoModificar(objeto);
		
	}
	
	private void distribuirEventoModificar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onModificar(objeto);
		}
	}

	@Override
	public boolean onValidarDatos(Object objeto, TipoFuncion funcion, String nombre) {
		return distribuirEventoValidarDatos(objeto,funcion,nombre);
	}
	
	private boolean distribuirEventoValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		boolean validarDatos = true;
		for (ComponenteDatosListener l : listeners) {
			if (!l.onValidarDatos(objeto, tipo, nombre)) {
				validarDatos = false;
			}
		}
		return validarDatos;
	}

	@Override
	public void setObjetoEntidad(Object objetoEntidad) {
		this.objetoEntidad = objetoEntidad;
		distribuirEventoObjetoEntidad(objetoEntidad);
	}
	
	private void distribuirEventoObjetoEntidad(Object object) {
		for (ComponenteDatosListener l : listeners) {
			l.onObjetoEntidad(object);
		}
	}

	@Override
	public void setParametros(List listaParametros) {
		this.listaParametros = listaParametros;		
		distribuirEventoListaParametros(listaParametros);		
	}

	private void distribuirEventoListaParametros(List listaParametros) {
		for (ComponenteDatosListener l : listeners) {
			l.onListaParametros(listaParametros);
		}
	}
	
	public TablaDatosSimple getTabla() {
		return tabla;
	}

	public void setTabla(TablaDatosSimple tabla) {
		this.tabla = tabla;
	}

	public com.obelisco.vista.componentes.TablaDatosSimple getTablaLista() {
		return tablaLista;
	}

	public void setTablaLista(
			com.obelisco.vista.componentes.TablaDatosSimple tablaLista) {
		this.tablaLista = tablaLista;
	}

	public void addComponenteDatosListener(ComponenteDatosListener listener) {
		listeners.add(listener);
	}
	
	public void removeCatalogoListener(ComponenteDatosListener listener) {
		listeners.remove(listener);
	}

	@Override
	protected void onCancelar() {
		// TODO Auto-generated method stub
		
	}

	public PaneBusquedaBase getPaneBusquedaBase() {
		return paneBusquedaBase;
	}

	public void setPaneBusquedaBase(PaneBusquedaBase paneBusquedaBase) {
		this.paneBusquedaBase = paneBusquedaBase;
	}

	public String getCampoToolTipText() {
		return campoToolTipText;
	}

	public void setCampoToolTipText(String campoToolTipText) {
		this.campoToolTipText = campoToolTipText;
	}
}
